package com.heyun.controller;

import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Colour;
import jxl.write.Label;
import jxl.write.Number;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.heyun.bean.HeyunBasicInfo;
import com.heyun.bean.HeyunNotice;
import com.heyun.bean.Message;
import com.heyun.service.NoticeService;



@Controller
public class NoticeController {

	@Autowired
	private NoticeService noticeService;
	
	/**
	 * 输出为excel文件的方法
	 * @param response
	 */
	@RequestMapping("/getNoticeDataAsExcel")
	public void getNoticeDataAsExcel(HttpServletResponse response){
		try {
			// 获取响应的 输出流
			OutputStream out = response.getOutputStream();
			// 设置下载的文件类型
			response.setContentType("application/vnd.ms-excel");
			// 设置Header,可以设置下载附件的文件名
			response.setHeader("Content-Disposition",
					"attachment; filename=" + new String(("公告信息统计.xls").getBytes(), "ISO-8859-1"));
			// 创建一个工作簿对象
			WritableWorkbook book = Workbook.createWorkbook(out);
			// 创建 一个 或多个 工作表,指定工作簿选项卡的名称，以及 工作表的 索引位置
			WritableSheet sheet1 = book.createSheet("sheet1", 0);

			// 创建一个字体对象，封装指定的字体
			WritableFont font1 = new WritableFont(WritableFont.createFont("隶书"), 20);
			font1.setColour(Colour.RED);
			// 创建一个 单元格 格式对象，封装指定格式
			WritableCellFormat wcTitle = new WritableCellFormat();
			wcTitle.setFont(font1);
			//设置文本位置居中
			wcTitle.setAlignment(Alignment.CENTRE);
			// 向工作表中 添加单元格，单元格 内容 需要借助于 Label（封装为String）对象 或 Number（封装为数值）对象进行封装
			sheet1.addCell(new Label(0, 0, "基础信息", wcTitle));
			//合并单元格：从0+1列0+1行到4+1列0+1行
			sheet1.mergeCells(0, 0, 3, 0);
			sheet1.addCell(new Label(0, 1, "ID"));
			sheet1.addCell(new Label(1, 1, "公告标题"));
			sheet1.addCell(new Label(2, 1, "公告内容"));
			sheet1.addCell(new Label(3, 1, "创建时间"));
			// 模拟 数据库查询，从数据库获取一个 用户集合
			List<HeyunNotice> noticeList = noticeService.listNotice();

			// 将用户集合 写入到 excel中,每循环一次，写入一行数据
			for (int i = 0; i < noticeList.size(); i++) {
				HeyunNotice notice = noticeList.get(i);
				sheet1.addCell(new Number(0, (i + 2), notice.getNoticeId()));
				sheet1.addCell(new Label(1, (i + 2), notice.getNoticeName()));
				sheet1.addCell(new Label(2, (i + 2), notice.getNoticeContent()));
				sheet1.addCell(new Label(3, (i + 2), notice.getCreateTime()));
			}

			// 将工作簿对象 输出到磁盘
			book.write();
			book.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 模糊查询分页显示公告信息
	 * @param pn 传入页码参数和模糊查询条件
	 * @return 返回对应页码的信息
	 * @throws UnsupportedEncodingException 
	 */
	@RequestMapping(value="/notices_byLike",method=RequestMethod.GET)
	@ResponseBody
	public Message listNoticeByNameLike(@RequestParam(value="pn",defaultValue="1")Integer pn,String likeName) throws UnsupportedEncodingException{
		//转换获取的前台数据的编码为UTF-8
		String noticeName = new String(likeName.getBytes("ISO-8859-1"), "UTF-8");
		//引入pageHelper插件
		//在查询之前调用PageHelper.startPage(pn, 5)方法，传入要查询的页数和每页显示的数据数量
		PageHelper.startPage(pn, 5);
		//startPage()后面紧跟的就是一个分页查询的数据
		List<HeyunNotice> noticeList = noticeService.getNoticeByLikeNoticeName(noticeName);
		//使用PageInfo包装查询后的结果，只要将PageInfo交个页面就行了
		//封装了详细的分页信息，包括查询出来的数据，传入连续显示的页数
		PageInfo<HeyunNotice> page = new PageInfo<HeyunNotice>(noticeList,5);
		
		return Message.success().add("pageInfo",page);
		
	}
	
	/**
	 * 删除公告的方法
	 * @param noticeId 传如参数为int型noticeId
	 * @return 返回执行删除的结果：成功or失败
	 */
	@RequestMapping(value="/notice/{noticeId}",method=RequestMethod.DELETE)
	@ResponseBody
	public Message deleteNotice(@PathVariable("noticeId")Integer noticeId){
		noticeService.deleteNoticeByNoticeId(noticeId);
		return Message.success();
	}
	
	/**
	 * 更新公告的方法
	 * @param notice 传入对象为notice对象
	 * @return 返回更新的结果
	 */
	@RequestMapping(value="/notice/{noticeId}",method=RequestMethod.PUT)
	@ResponseBody
	public Message updateNotice(HeyunNotice notice){
		System.out.println("要更新的公告信息：" + notice);
		noticeService.updateNoticeByNoticeId(notice);
		return Message.success();
	}
	/**
	 * 通过ID查询单个公告信息
	 * @param id
	 * @return 返回查询到的notice对象
	 */
	@RequestMapping(value="/notice/{id}",method=RequestMethod.GET)
	@ResponseBody
	public Message getNotice(@PathVariable("id")Integer id){
		HeyunNotice notice = noticeService.getNoticeById(id);
		System.out.println("查看的："+notice);
		return Message.success().add("notice", notice);
	}
	/**
	 * 保存新增公告信息
	 * @param notice 传入对象为HeyunNotice对象
	 * @return 返回保存是否成功
	 */
	@RequestMapping(value="/notice",method=RequestMethod.POST)
	@ResponseBody
	public Message saveNotice(HeyunNotice notice,BindingResult result){
		noticeService.insertNotice(notice);
		return Message.success();
	}
	/**
	 * 分页查询公告信息
	 * @param pn 传入页码参数
	 * @return 返回对应页码的信息
	 */
	@RequestMapping("/notices")
	@ResponseBody
	public Message listNotice(@RequestParam(value="pn",defaultValue="1")Integer pn){
		//引入pageHelper插件
		//在查询之前调用PageHelper.startPage(pn, 5)方法，传入要查询的页数和每页显示的数据数量
		PageHelper.startPage(pn, 5);
		//startPage()后面紧跟的就是一个分页查询的数据
		List<HeyunNotice> noticeList = noticeService.listNotice();
		//使用PageInfo包装查询后的结果，只要将PageInfo交个页面就行了
		//封装了详细的分页信息，包括查询出来的数据，传入连续显示的页数
		PageInfo<HeyunNotice> page = new PageInfo<HeyunNotice>(noticeList,5);
		
		return Message.success().add("pageInfo",page);
		
	}
	
	
}
